#ifndef AST_LOOP
#define AST_LOOP
#include <string>
#include "node.h"

namespace AST {

    /**
     * Laço de Repetição
     *
     * Estrutura utilizada para execução de determinado bloco de comandos
     * específicos se o teste apresentado estiver sendo considerado em sucesso
     * para cada execução.
     *
     * @category AST
     * @package  AST
     */
    class Loop : public Node {

    private:

        /**
         * Expressão Condicional
         */
        Node* _expression;

        /**
         * Estrutura para Execução em Sucesso
         */
        Node* _command;

        /**
         * Configuração de Expressão Condicional
         *
         * Método utilizado para armazenamento do nó de árvore abstrata de
         * sintaxe que simboliza a expressão utilizada em teste para que sempre
         * em caso de sucesso execute determinadas instruções definidas.
         *
         * @param  Node* Elemento para Configuração
         * @return Loop* Próprio Objeto para Encadeamento
         */
        Loop* _setExpression(Node*);

        /**
         * Configuração de Bloco de Comandos em Sucesso
         *
         * Método utilizado para configurar o nó de árvore abstrata de sintaxe
         * responsável pelo armazenamento do bloco de comandos que devem ser
         * executados para cada passo do laço de repetição onde o teste em
         * expressão condicional estiver em sucesso.
         *
         * @param  Node* Elemento para Configuração
         * @return Loop* Próprio Objeto para Encadeamento
         */
        Loop* _setCommand(Node*);

    public:

        /**
         * Construtor
         *
         * Método utilizado para construção de novos objetos para nó de árvore
         * abstrata de sintaxe que representa um laço de repetição. Recebe como
         * parâmetros a expressão condicional que deve ser executada em cada
         * passo e o bloco de comandos que deve ser executado sempre que o teste
         * estiver em sucesso.
         *
         * @param  Node* Expressão Condicional
         * @param  Node* Bloco de Comandos para Teste em Sucesso
         */
        Loop(Node*, Node*);

        /**
         * Apresenta a Expressão Condicional
         *
         * Utilizado para apresentar o nó de árvore abstrata de sintaxe que
         * representa a expressão condicional do laço de repetição. Sempre que o
         * teste estiver em caso de sucesso, devemos executar o bloco de
         * comandos.
         *
         * @return Elemento Solicitado
         */
        Node* getExpression();

        /**
         * Apresenta o Bloco de Comandos em Sucesso
         *
         * Utilizado para apresentar o nó de árvore abstrata de sintaxe que
         * representa o bloco de comandos que deve ser executado sempre que a
         * expressão condicional estiver em caso de sucesso para determinado
         * passo da iteração.
         *
         * @return Elemento Solicitado
         */
        Node* getCommand();

        // Sobrescrita
        std::string toString(int);

    };

};

#endif

